<template>
    <!-- 项目选择 -->
    <a-select v-model="currentValue" v-bind="$attrs" :placeholder="project.length===0 && isDisabled?'':placeholder" v-on="$listeners" :disabled="project.length===0 && isDisabled">
        <a-icon v-if="fetching" slot="suffixIcon" style="color: #096dd9" type="loading" />
        <a-spin v-if="fetching" slot="notFoundContent" size="small" />
        <a-select-option v-for="i in project" :key="i.code" :value="i.code">
            {{ i.name }} 
        </a-select-option>
    </a-select>
</template>
<script>
import { getProject, getAuditProject } from '@/api/themeChoose/themeChoose'

export default {
    name: 'SelectProject',
    props: {
        // v-model绑定的数据
        value: {
            type: [Array, String, Object, Number]
        },
        // 需要联动的表单名，
        form: {
            type: Object,
            default: () => ({})
        },
        // placeholder
        placeholder: {
            type: String,
            default: () => '请选择'
        },
        // 需要联动的表单名
        keyValue: {
            type: String,
            default: () => 'branchCompanyId'
        },
        // 联动表单值改变时是否清空当前表单值
        isClear: {
            type: Boolean,
            default: () => true
        },
        // 项目审批状态
        auditStatus: {
            type: String,
            default: () => 'PAST'
        },
        //如果是编辑，第一次不要重置绑定的值。。。。
        isEdit: {
            type: Boolean,
            default: () => false
        },
        // 是否为登陆人权限内的项目
        isSelf: {
            type: Boolean,
            default: () => true
        },
        // 是否自动选中第一行
        autoSelected: {
            type: Boolean,
            default: () => true
        },
        // 是否需要显示维保期的项目
        isMaintenance: {
            type: Boolean,
            default: () => false
        },
        // 是否筛选出当前登录项目部的项目
        onlyCurrentPd: {
            type: Boolean,
            default: false
        },
        // 是否需要关联，如果为true，那么在没有关联项时不会请求数据
        needLink: {
            type: Boolean,
            default: true
        },
        // 是否自动选中登录人所在项目
        isDefaultSelected: {
            type: Boolean,
            default: () => false
        },
        // 单位的层级，用于映射不同的参数请求项目
        unitCode: {
            type: String,
            default: () => ''
        },
        //用于有些分公司需要清理项目
        empty: {
            type: Boolean,
            default: () => false
        },
        //用于有些分公司需要清理项目
        emptyId: {
            type: String,
            default: () => ''
        },
        //没有值是否禁用
        isDisabled:{
             type: Boolean,
             default: () => false

        }
    },
    mounted() {
        // 获取当前登录人选中岗位的组织层级
        this.orgLevel = JSON.parse(sessionStorage.getItem('ycloud-user_info'))?.currentPost?.code
        this.getList()
    },
    data() {
        return {
            // isCanClear: !this.isEdit, //data里获取到的值，早于prop传的，应该用watch来设置值
            isCanClear: null, // 是否清除
            fetching: false, // 加载控件
            project: [], // 项目列表
            orgLevel: '', // 当前登录人选中岗位的组织层级
            userInfo: JSON.parse(sessionStorage.getItem('ycloud-user_info'))
        }
    },
    methods: {
        /**
         * 获取项目列表
         */
        getList() {
            this.$nextTick(() => {
                if (!this.attr && this.needLink) {
                    // if (!this.attr && this.orgLevel != 'PD') {
                    return
                }
                // console.log(this.form[this.keyValue])
                if (this.empty && this.attr == this.emptyId) {
                    this.project = []
                    this.currentValue = undefined
                    return
                }
                const api = this.isSelf ? getAuditProject : getProject
                let params
                // 非登录人参数
                if (!this.isSelf) {
                    params = {
                        query: {
                            branchComIds: [this.attr], // 分公司
                            auditStatus: this.auditStatus // 添加审核状态
                        }
                    }
                    // 登录人参数
                } else {
                    params = {}
                    if (this.orgLevel != 'PD' && this.unitCode !== 'CO') {
                        params.branchComIds = [this.attr]
                    }
                    if (this.isMaintenance) {
                        params.projectStatus = '1,2,3,4,5,6'
                    }
                    if (this.isDefaultSelected) {
                        params.deptOrgIds = [this.userInfo.currentPost.id]
                    }
                }
                this.fetching = true
                api(params)
                    .then((res) => {
                        this.fetching = false
                        // 统一项目列表字段配置
                        this.project = this.isSelf
                            ? res.data?.map((i) => ({
                                  code: i.projectId,
                                  name: i.projectName,
                                  projectDeptId: i.projectDeptId,
                                  $origin: i
                              }))
                            : res.data ?? []
                        // 筛选出项目部所在的项目
                        if (this.onlyCurrentPd) {
                            const currentPost =
                                JSON.parse(sessionStorage.getItem('ycloud-user_info'))?.currentPost || {}
                            if (currentPost.code === 'PD') {
                                this.project = this.project.filter((item) => item.projectDeptId === currentPost.id)
                            }
                        }
                        // 当没有选中项时，若是登陆人权限列表、支持选中且列表第一项存在则添加默认值
                        if (!this.currentValue && this.isSelf && this.autoSelected && this.project[0]?.code) {
                            // this.$emit('input', this.project[0].code)
                            //默认选中后触发change事件
                            let value = this.$attrs.hasOwnProperty('labelInValue')
                                ? { key: this.project[0].code, label: this.project[0].name }
                                : this.project[0].code // labelInValue存在时，返回labelInValue对象
                            this.$emit('input', value)
                            this.$emit('change', value)
                            this.$emit('autoSelected', value)
                            this.$emit('selectChange', this.project[0])
                        } else if (this.currentValue) {
                            // console.log(this.project?.find((item) => item.code === this.currentValue))
                            this.$emit(
                                'selectChange',
                                this.project?.find((item) => item.code === this.currentValue)
                            )
                        }
                        if (this.isDefaultSelected && !this.isSelf) {
                          // this.$emit('input', this.project[0].code)
                          //默认选中后触发change事件
                            getProject({
                                query:{
                                    branchComIds: [this.attr], // 分公司
                                    auditStatus: this.auditStatus, // 添加审核状态
                                    deptOrgIds : [this.userInfo.currentPost.id]
                                }
                            }).then(e=>{
                                if(e?.code === 200){
                                    let value = this.$attrs.hasOwnProperty('labelInValue')
                                      ? { key: e.data?.[0]?.code, label: e.data?.[0]?.name }
                                      : e.data?.[0]?.code // labelInValue存在时，返回labelInValue对象
                                    this.$emit('input', value)
                                    this.$emit('change', value)
                                    this.$emit('autoSelected', value)
                                    this.$emit('selectChange', value)
                                }
                            })
                        }
                    })
                    .catch((res) => {
                        this.fetching = false
                        this.$message.error(res?.data?.message || '获取项目列表失败！')
                    })
            })
        },
        /**
         * 获取指定项目的name
         */
        getValueName(id) {
            const target = this.project.find((item) => item.code === id)
            return (target && target.name) || void 0
        }
    },
    computed: {
        // 需要联动的表单值
        attr() {
            return this.form[this.keyValue]
        },
        // 转换绑定的选中数据，与v-model同步
        currentValue: {
            get: function () {
                return this.value
            },
            set: function (value) {
                this.$emit('input', value)
              //2020-11-18备注：bug出现在，公司岗位时，bform里面切换了公司，项目部不能置空，因为andt表单只监听change事件，绝绝了。啥j2bug我都遇得到
                this.$emit('change', value)
                let res = this.project.find((v) => v.code === value)
                res && this.$emit('selectChange', res)
            }
        }
    },
    watch: {
      isEdit:{
        handler(val){
          this.isCanClear= !val
        },
        immediate:true
      },
        // 监听联动表单值重置项目列表
        //2020/12/21备注，在model里面使用，不好使就整个v-if
        /*
    *   v-if="visible"
        placeholder="请选择"
        v-model="queryParam.projectId"
        :form="queryParam"
        :isClear="false"
        :isEdit="true"
        keyValue="branchCompanyId"
        *
        *
        * 2021/11/09,更新，上面的使用方法作废
        * 时隔一年，这个组件出现个诡异bug，明明form里面有projectId
        * 用分公司岗位，可以正常使用，用项目部岗位，却显示出出来
        * 经常一上午的排查，发现是下面的代码有问题，
        * this.isCanClear是在data里面取的isEdit的反值，
        * isEdit的默认值是false，外面的prop传出去的true
        * 在data里面是获取不到的，所以isCanClear恒定为true
        * 下面的代码会执行this.currentValue
        *         *   // 清空表单
            if (this.isEdit && this.isCanClear) {
              this.currentValue = void 0
                this.$emit('resetSelf') // 在搜索组件(SearchData)中重置自身的值
            } else {
                this.isCanClear = true
            }
        *
        * 后面改成watch isEdit的值来更改isCanClear就行了，
        *
    * */
        attr(val) {
            // 清空表单
            if (this.isClear && !this.isEdit) {
                this.currentValue = void 0
                this.$emit('resetSelf') // 在搜索组件(SearchData)中重置自身的值
            }
            // 清空表单
            if (this.isEdit && this.isCanClear) {
              this.currentValue = void 0
                this.$emit('resetSelf') // 在搜索组件(SearchData)中重置自身的值
            } else {
                this.isCanClear = true
            }
            // 重置列表
            this.project = []
            val && this.getList()
        }
    }
}
</script>
